home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-15 / idediags.zip / IDEDIAG.C < prev    next >
Text File  |  1991-03-02  |  5KB  |  175 lines

  1. /********************************************************************
  2.     idediag
  3.     shows characteristics of IDE hard disks.
  4.     Public Domain by Paolo Bevilacqua, Rome.
  5.     You can add more disk type to the idetypes[]
  6.     table, and distribuite freely.
  7. ********************************************************************/
  8.  
  9.  
  10. #include "1010_hdc.h"
  11.  
  12.  
  13. unsigned secbuf[256];
  14. int drive;
  15.  
  16. struct {
  17.     unsigned cylinders,
  18.          heads,
  19.          sectors;
  20.     char     *name;
  21. } idetypes[] = {
  22.     { 667,  4, 33, "Fujitsu M2611T (42.9 MB)" },
  23.     { 667,  8, 33, "Fujitsu M2612T (85.9 MB)" },
  24.     { 667, 12, 33, "Fujitsu M2613T (128.9 MB)" },
  25.     { 667, 16, 33, "Fujitsu M2614T (171.9 MB)" },
  26.     { 782,  2, 27, "Western Digital WD93024-A (20.6 MB)" },
  27.     { 782,  4, 27, "Western Digital WD93044-A (41.2 MB)" },
  28.     { 845,  3, 35, "Toshiba MK232FC (45.4 MB"},
  29.     { 845,  7, 35, "Toshiba MK234FC (106 MB"},
  30.     { 965,  5, 17, "Quantum ProDrive 40AT (40 MB)"},
  31.     { 965, 10, 17, "Quantum ProDrive 80AT (80 MB)"},
  32.     {1050,  2, 40, "Teac SD-340 (41 MB)"},
  33.     { 776,  8, 33, "Conner CP-3104 (100 MB)"},
  34.     { 745,  4, 28, "Priam 3804M 40.7 MB"},
  35.     {    0,  0,    0, ""}
  36. };
  37.  
  38.  
  39.  
  40. struct ideinfo {
  41.     unsigned genconf,
  42.          fixcyls,
  43.          remcyls,
  44.          heads,
  45.          bytetrack,     /* bytes per track */
  46.          bytesector,    /* bytes per sector */
  47.          sectors,        /* sectors per track */
  48.          byteisg,        /* bytes intesector gap */
  49.          byteplo,        /* bytes in sync */
  50.          worduniq;        /* words unique status */
  51.     char serial[20];
  52.     unsigned contype,        /* controller type */
  53.          bufsiz,        /* buffer size in 512 byte blocks */
  54.          byteecc;        /* ECC bytes trasferred in read/write long */
  55.     char firmware[8],        /* firmware revision */
  56.      model[40];        /* model ID */
  57.     unsigned secsint,        /* number of sectors transferred per interrupt */
  58.          dblword,        /* double word transfer flag */
  59.          writepro;        /* write protect */
  60. };
  61.  
  62. printinfo() {
  63.  
  64.     struct ideinfo *id = (struct ideinfo *)secbuf;
  65.     int i, capacity;
  66.     char c, *type;
  67.  
  68.     /* get disk type by characteristics */
  69.     for (i=0; idetypes[i].cylinders != 0; ++i)
  70.     if (idetypes[i].cylinders == id->fixcyls &&
  71.         idetypes[i].heads == id->heads &&
  72.         idetypes[i].sectors == id->sectors) {
  73.         type = idetypes[i].name;
  74.         break;
  75.     }
  76.  
  77.     /* unknow disk */
  78.     if (idetypes[i].cylinders == 0) {
  79.     type = "Unknown              ";
  80.  
  81.     /* calculate capacity in MB */
  82.     capacity = (id->fixcyls * id->heads * id->sectors) / 2048;
  83.     itoa(capacity, type+8, 10);
  84.     strcat(type, "Mbytes");
  85.     }
  86.  
  87.     /* swap bytes in ASCII fields except for WD disks */
  88.  
  89.     if (i != 4 && i != 5) {
  90.  
  91.     for(i=0; i < 10; ++i) {
  92.         c = id->serial[i*2];
  93.         id->serial[i*2] = id->serial[i*2+1];
  94.         id->serial[i*2+1] = c;
  95.     }
  96.  
  97.     for(i=0; i < 4; ++i) {
  98.         c = id->firmware[i*2];
  99.         id->firmware[i*2] = id->firmware[i*2+1];
  100.         id->firmware[i*2+1] = c;
  101.     }
  102.  
  103.     for(i=0; i < 20; ++i) {
  104.         c = id->model[i*2];
  105.         id->model[i*2] = id->model[(i*2)+1];
  106.         id->model[i*2+1] = c;
  107.     }
  108.     }
  109.  
  110.     printf("Informations for drive %u, %s\n"
  111.        "Drive ID: %04X\n"
  112.        "%u fixed cylinders, %u removables\n"
  113.        "%u heads, %u sectors\n"
  114.        "Serial number: %.20s\n"
  115.        "Controller firmware: %.8s\n"
  116.        "Controller model: %.408s\n"
  117.        "%u bytes per track, %u per sector\n"
  118.        "%u bytes of intersector gap, %u of sync\n"
  119.        "Controller type %u, buffer %u Kbytes\n"
  120.        "%u bytes of ECC, %u sector(s) transferred per interrupt\n"
  121.        "Double word transfer %s allowed, %s write protected.\n",
  122.  
  123.        drive, type,
  124.        id->genconf,
  125.        id->fixcyls, id->remcyls,
  126.        id->heads, id->sectors,
  127.        id->serial,
  128.        id->firmware,
  129.        id->model,
  130.        id->bytetrack, id->bytesector,
  131.        id->byteisg, id->byteplo,
  132.        id->contype, id->bufsiz / 2,
  133.        id->byteecc, id->secsint,
  134.        id->dblword ? "" : "not", id->writepro ? "" : "not");
  135.  
  136. }
  137.  
  138. main() {
  139.  
  140.     drive = 0;
  141.  
  142.     /* disable interrupt from drive */
  143.     outp(HDC_FIXED, HDC_FIXED_IRQ);
  144.  
  145.     /* set up task file parameter */
  146.     outp(HDC_SDH, 0xA0 + (drive<<4));
  147.  
  148.     /* issue read parameters */
  149.     outp(HDC_COMMAND, HDC_COMMAND_READPAR);
  150.  
  151.     /* read up sector */
  152.     readsect();
  153.  
  154.     /* print out info */
  155.     printinfo();
  156.  
  157. }
  158.  
  159. readsect() {
  160.  
  161.     int i;
  162.  
  163.     /* poll DRQ */
  164.     while(inp(HDC_STATUS) & HDC_STATUS_BUSY)
  165.     ;
  166.  
  167.     /* read up sector */
  168.     for (i=0; i<256; ++i)
  169.     secbuf[i] = inpw(HDC_DATA);
  170.  
  171. }
  172.  
  173.  
  174.  
  175.